home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / RegTool.cls < prev    next >
Text File  |  1997-06-14  |  12KB  |  356 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "GRegTool"
  6. Attribute VB_GlobalNameSpace = True
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.  
  12. Public Enum EErrorRegTool
  13.     eeBaseRegTool = 13590   ' RegTool
  14. End Enum
  15.  
  16. Const sWin = "Software\Microsoft\Windows\"
  17. Const sExp = "CurrentVersion\Explorer\Shell Folders"
  18. Const sWinExp = sWin & sExp
  19. Const sBack = "\"
  20.  
  21. Function GetRegValue(ByVal hKey As Long, sName As String, _
  22.                      vValue As Variant) As Long
  23.     Dim cData As Long, sData As String, ordType As Long, e As Long
  24.     e = RegQueryValueEx(hKey, sName, pNull, ordType, 0&, cData)
  25.     If e And e <> ERROR_MORE_DATA Then Exit Function
  26.     Select Case ordType
  27.     Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
  28.         Dim iData As Long
  29.         e = RegQueryValueExInt(hKey, sName, pNull, _
  30.                                ordType, iData, cData)
  31.         vValue = iData
  32.         
  33.     Case REG_DWORD_BIG_ENDIAN  ' Unlikely, but you never know
  34.         Dim dwData As Long
  35.         e = RegQueryValueExInt(hKey, sName, pNull, _
  36.                                ordType, dwData, cData)
  37.         vValue = MBytes.SwapEndian(dwData)
  38.         
  39.     Case REG_SZ, REG_MULTI_SZ ' Same thing to Visual Basic
  40.         sData = String$(cData - 1, 0)
  41.         e = RegQueryValueExStr(hKey, sName, pNull, _
  42.                                ordType, sData, cData)
  43.         vValue = sData
  44.         
  45.     Case REG_EXPAND_SZ
  46.         sData = String$(cData - 1, 0)
  47.         e = RegQueryValueExStr(hKey, sName, pNull, _
  48.                                ordType, sData, cData)
  49.         vValue = MUtility.ExpandEnvStr(sData)
  50.         
  51.     ' Catch REG_BINARY and anything else
  52.     Case Else
  53.         Dim abData() As Byte
  54.         ReDim abData(cData)
  55.         e = RegQueryValueExByte(hKey, sName, pNull, _
  56.                                 ordType, abData(0), cData)
  57.         vValue = abData
  58.         
  59.     End Select
  60.     GetRegValue = e
  61. End Function
  62.  
  63. Function CreateRegValue(vValueA As Variant, ByVal hKeyA As Long, _
  64.                         Optional sNameA As String) As Long
  65.     Dim c As Long, e As Long, ordType As Long
  66.     Select Case VarType(vValueA)
  67.     Case vbArray + vbByte
  68.         Dim ab() As Byte
  69.         ab = vValueA
  70.         ordType = REG_BINARY
  71.         c = UBound(ab) - LBound(ab) - 1
  72.         e = RegSetValueExByte(hKeyA, sNameA, pNull, ordType, ab(0), c)
  73.         
  74.     Case vbLong, vbInteger
  75.         Dim i As Long
  76.         i = vValueA
  77.         ordType = REG_DWORD
  78.         e = RegSetValueExInt(hKeyA, sNameA, pNull, ordType, i, 4)
  79.         
  80.     Case vbString
  81.         Dim s As String, iPos As Long
  82.         s = vValueA
  83.         ordType = REG_SZ
  84.         ' Assume anything with two non-adjacent percents is expanded string
  85.         iPos = InStr(s, "%")
  86.         If iPos Then
  87.             If InStr(iPos + 2, s, "%") Then ordType = REG_EXPAND_SZ
  88.         End If
  89.         c = Len(s) + 1
  90.         e = RegSetValueExStr(hKeyA, sNameA, pNull, ordType, s, c)
  91.         
  92.     ' User should convert to a compatible type before calling
  93.     Case Else
  94.         e = ERROR_INVALID_DATA
  95.         
  96.     End Select
  97.     CreateRegValue = e
  98. End Function
  99.  
  100. Function GetRegValueNext(ByVal hKey As Long, _
  101.                          i As Long, _
  102.                          sName As String, _
  103.                          vValue As Variant) As Long
  104.     Dim cName As Long, cData As Long, sData As String
  105.     Dim ordType As Long, cJunk As Long, ft As FILETIME
  106.     Static hKeyPrev As Long, cNameMax As Long
  107.     ' When enumerating, cache required data the first time
  108.     If hKeyPrev <> hKey Or cNameMax = 0 Then
  109.         hKeyPrev = hKey
  110.         GetRegValueNext = _
  111.             RegQueryInfoKey(hKey, sNullStr, cJunk, pNull, _
  112.                             cJunk, cJunk, cJunk, cJunk, _
  113.                             cNameMax, cJunk, cJunk, ft)
  114.         If GetRegValueNext Then Exit Function
  115.     End If
  116.     
  117.     ' Get the value name and type in the first call
  118.     vValue = Empty
  119.     cName = cNameMax + 1
  120.     sName = String$(cName, 0)
  121.     GetRegValueNext = _
  122.         RegEnumValue(hKey, i, sName, cName, _
  123.                      pNull, ordType, pNull, cData)
  124.     If GetRegValueNext Then
  125.         If GetRegValueNext <> ERROR_MORE_DATA Then
  126.             Exit Function
  127.         End If
  128.     End If
  129.     sName = Left$(sName, cName)
  130.     
  131.     ' Handle each type separately
  132.     Select Case ordType
  133.     Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
  134.         Dim iData As Long
  135.         GetRegValueNext = _
  136.             RegEnumValueInt(hKey, i, sName, cName + 1, _
  137.                             pNull, ordType, iData, cData)
  138.         vValue = iData
  139.         
  140.     Case REG_DWORD_BIG_ENDIAN  ' Unlikely, but you never know
  141.         Dim dwData As Long
  142.         GetRegValueNext = _
  143.             RegEnumValueInt(hKey, i, sName, cName + 1, _
  144.                             pNull, ordType, dwData, cData)
  145.         vValue = MBytes.SwapEndian(dwData)
  146.         
  147.     Case REG_SZ, REG_MULTI_SZ ' Same thing to Visual Basic
  148.         sData = String$(cData - 1, 0)
  149.         GetRegValueNext = _
  150.             RegEnumValueStr(hKey, i, sName, cName + 1, _
  151.                             pNull, ordType, sData, cData)
  152.         vValue = sData
  153.         
  154.     Case REG_EXPAND_SZ         ' Expand environment variables
  155.         sData = String$(cData - 1, 0)
  156.         GetRegValueNext = _
  157.             RegEnumValueStr(hKey, i, sName, cName + 1, _
  158.                             pNull, ordType, sData, cData)
  159.         vValue = MUtility.ExpandEnvStr(sData)
  160.     
  161.     Case Else       ' Catch REG_BINARY and anything else
  162.         Dim abData() As Byte
  163.         ReDim abData(cData)
  164.         GetRegValueNext = _
  165.             RegEnumValueByte(hKey, i, sName, cName + 1, _
  166.                              pNull, ordType, _
  167.                              abData(0), cData)
  168.         vValue = abData
  169.         
  170.     End Select
  171.     
  172. End Function
  173.  
  174. Function GetRegNodeNext(ByVal hKey As Long, i As Long, sName As String) As Long
  175.     Dim cName As Long, cJunk As Long, ft As FILETIME
  176.     Static hKeyPrev As Long, cNameMax As Long
  177.     If hKeyPrev <> hKey Or cNameMax = 0 Then
  178.         hKeyPrev = hKey
  179.         GetRegNodeNext = RegQueryInfoKey(hKey, sNullStr, cJunk, pNull, _
  180.                                          cJunk, cNameMax, cJunk, cJunk, _
  181.                                          cJunk, cJunk, cJunk, ft)
  182.         If GetRegNodeNext Then Exit Function
  183.     End If
  184.     
  185.     cName = cNameMax + 1
  186.     sName = String$(cName, 0)
  187.     GetRegNodeNext = RegEnumKeyEx(hKey, i, sName, cName, _
  188.                                   pNull, sNullStr, cJunk, ft)
  189.     sName = Left$(sName, cName)
  190.    
  191. End Function
  192.  
  193. Function CreateRegNode(ByVal hKey As Long, sKeyNew As String, _
  194.                        hKeyNew As Long, Optional fExisted As Boolean, _
  195.                        Optional ByVal afAccess As Long = KEY_ALL_ACCESS _
  196.                        ) As Long
  197.     Dim e As Long, ordResult As Long
  198.     CreateRegNode = RegCreateKeyEx(hKey, sKeyNew, 0&, sEmpty, _
  199.                                    REG_OPTION_NON_VOLATILE, _
  200.                                    afAccess, pNull, _
  201.                                    hKeyNew, ordResult)
  202.     fExisted = (ordResult = REG_OPENED_EXISTING_KEY)
  203. End Function
  204.  
  205. ' Delete node, but only if it has no subnodes (emulate WinNT RegDeleteKey)
  206. Function DeleteOneRegNode(ByVal hKeyRoot As Long, sKey As String) As Long
  207.     If MUtility.IsNT Then
  208.         DeleteOneRegNode = RegDeleteKey(hKeyRoot, sKey)
  209.     Else
  210.         ' Check to see if there are subnodes
  211.         Dim cJunk As Long, e As Long, cNode As Long, ft As FILETIME
  212.         e = RegQueryInfoKey(hKeyRoot, sNullStr, cJunk, _
  213.                             pNull, cNode, cJunk, cJunk, _
  214.                             cJunk, cJunk, cJunk, cJunk, ft)
  215.         ' Delete only if no nodes
  216.         If cNode = 0 Then
  217.             DeleteOneRegNode = RegDeleteKey(hKeyRoot, sKey)
  218.         Else
  219.             DeleteOneRegNode = ERROR_ACCESS_DENIED
  220.         End If
  221.     End If
  222. End Function
  223.  
  224. ' Delete node and all its subnodes (emulate Win95 RegDeleteKey)
  225. Function DeleteRegNodes(ByVal hKeyRoot As Long, sKey As String) As Long
  226.     Dim sKeyT As String, hSubKey As Long, ft As FILETIME
  227.  
  228.     ' Try to delete whole thing--always works for Win95, but fails on
  229.     ' nodes with subnodes in WinNT
  230.     DeleteRegNodes = RegDeleteKey(hKeyRoot, sKey)
  231.     If DeleteRegNodes = ERROR_SUCCESS Then Exit Function
  232.     DeleteRegNodes = RegOpenKeyEx(hKeyRoot, sKey, 0, _
  233.                                   KEY_ALL_ACCESS, hSubKey)
  234.     ' Delete each subnode
  235.     Do While DeleteRegNodes = ERROR_SUCCESS
  236.         sKeyT = String$(cMaxPath, 0)
  237.         DeleteRegNodes = RegEnumKeyEx(hSubKey, 0, sKeyT, cMaxPath, _
  238.                                       pNull, sNullStr, 0, ft)
  239.         sKeyT = MUtility.StrZToStr(sKeyT)
  240.         ' Recursive call to remove node and any subnodes
  241.         If DeleteRegNodes = ERROR_SUCCESS Then
  242.             DeleteRegNodes = DeleteRegNodes(hSubKey, sKeyT)
  243.         End If
  244.     Loop
  245.     Call RegCloseKey(hSubKey)
  246.     ' Try to delete root again
  247.     DeleteRegNodes = RegDeleteKey(hKeyRoot, sKey)
  248.     
  249. End Function
  250.  
  251. Function GetRegStr(sKey As String, sItem As String, _
  252.                    Optional ByVal hRoot As EROOTKEY _
  253.                        = HKEY_CURRENT_USER) As String
  254.     Dim e As Long, hKey As Long, s As String
  255.     ' Open a subkey
  256.     e = RegOpenKeyEx(hRoot, sKey, 0, KEY_QUERY_VALUE, hKey)
  257.     ApiRaiseIf e
  258.     Dim ert As EREGTYPE, c As Long
  259.     ' Get the length and make sure it's a string
  260.     e = RegQueryValueEx(hKey, sItem, 0&, ert, 0&, c)
  261.     ApiRaiseIf e
  262.     BugAssert ert = REG_SZ
  263.     If c <> 0 Then
  264.         s = String$(c - 1, 0)
  265.         ' Read the string
  266.         e = RegQueryValueExStr(hKey, sItem, 0&, ert, s, c)
  267.         ApiRaiseIf e
  268.     End If
  269.     RegCloseKey hKey
  270.     GetRegStr = s
  271. End Function
  272.  
  273. Function GetRegInt(sKey As String, sItem As String, _
  274.                    Optional ByVal hRoot As EROOTKEY = HKEY_CURRENT_USER _
  275.                    ) As Long
  276.     Dim e As Long, hKey As Long
  277.     ' Open a subkey
  278.     e = RegOpenKeyEx(hRoot, sKey, 0, KEY_QUERY_VALUE, hKey)
  279.     ApiRaiseIf e
  280.     Dim ert As EREGTYPE, iVal As Long, c As Long
  281.     ' Get the length and make sure it's an integer
  282.     e = RegQueryValueEx(hKey, sItem, 0&, ert, 0&, c)
  283.     ApiRaiseIf e
  284.     BugAssert ert = REG_DWORD
  285.     If c <> 0 Then
  286.         ' Read the integer
  287.         e = RegQueryValueExInt(hKey, sItem, 0&, ert, iVal, c)
  288.         ApiRaiseIf e
  289.     End If
  290.     RegCloseKey hKey
  291.     GetRegInt = iVal
  292. End Function
  293.  
  294. ' Get key locations in registry
  295.  
  296. Function GetDesktop() As String
  297.     GetDesktop = GetRegStr(sWinExp, "Desktop") & sBack
  298. End Function
  299.  
  300. Function GetFavorites() As String
  301.     GetFavorites = GetRegStr(sWinExp, "Favorites") & sBack
  302. End Function
  303.  
  304. Function GetStartMenu() As String
  305.     GetStartMenu = GetRegStr(sWinExp, "Start Menu") & sBack
  306. End Function
  307.  
  308. Function GetStartup() As String
  309.     GetStartup = GetRegStr(sWinExp, "Startup") & sBack
  310. End Function
  311.  
  312. Function GetPrograms() As String
  313.     GetPrograms = GetRegStr(sWinExp, "Programs") & sBack
  314. End Function
  315.  
  316. Function GetAppData() As String
  317.     GetAppData = GetRegStr(sWinExp, "AppData") & sBack
  318. End Function
  319.  
  320. Function GetCommonDesktop() As String
  321.     GetCommonDesktop = GetRegStr(sWinExp, "Common Desktop") & sBack
  322. End Function
  323.  
  324. Function GetCommonStartMenu() As String
  325.     GetCommonStartMenu = GetRegStr(sWinExp, "Common Start Menu") & sBack
  326. End Function
  327.  
  328. Function GetCommonStartup() As String
  329.     GetCommonStartup = GetRegStr(sWinExp, "Common Startup") & sBack
  330. End Function
  331.  
  332. Function GetCommonPrograms() As String
  333.     GetCommonPrograms = GetRegStr(sWinExp, "Common Programs") & sBack
  334. End Function
  335.  
  336. #If fComponent = 0 Then
  337. Private Sub ErrRaise(e As Long)
  338.     Dim sText As String, sSource As String
  339.     If e > 1000 Then
  340.         sSource = App.ExeName & ".RegTool"
  341.         Select Case e
  342.         Case eeBaseRegTool
  343.             BugAssert True
  344.        ' Case ee...
  345.        '     Add additional errors
  346.         End Select
  347.         Err.Raise COMError(e), sSource, sText
  348.     Else
  349.         ' Raise standard Visual Basic error
  350.         sSource = App.ExeName & ".VBError"
  351.         Err.Raise e, sSource
  352.     End If
  353. End Sub
  354. #End If
  355.  
  356.